/* Microsoft Reference Implementation for TPM 2.0
 *
 *  The copyright in this software is being made available under the BSD License,
 *  included below. This software may be subject to other third party and
 *  contributor rights, including patent rights, and no such rights are granted
 *  under this license.
 *
 *  Copyright (c) Microsoft Corporation
 *
 *  All rights reserved.
 *
 *  BSD License
 *
 *  Redistribution and use in source and binary forms, with or without modification,
 *  are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice, this list
 *  of conditions and the following disclaimer.
 *
 *  Redistributions in binary form must reproduce the above copyright notice, this
 *  list of conditions and the following disclaimer in the documentation and/or
 *  other materials provided with the distribution.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS""
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 *  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 *  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include "Tpm.h"
#include "PCR_Reset_fp.h"

#if CC_PCR_Reset  // Conditional expansion of this file

/*(See part 3 specification)
// Reset PCR
*/
//  Return Type: TPM_RC
//      TPM_RC_LOCALITY             current command locality is not allowed to
//                                  reset the PCR referenced by 'pcrHandle'
/*
If the attribute of a PCR allows the PCR to be reset and proper authorization is provided, 
then this command may be used to set the PCR in all banks to zero. The attributes of the PCR 
may restrict the locality that can perform the reset operation.
NOTE 1 The definition of TPMI_DH_PCR in TPM 2.0 Part 2 indicates that if pcrHandle is out of 
the allowed range for PCR, then the appropriate return value is TPM_RC_VALUE.
If pcrHandle references a PCR that cannot be reset, the TPM shall return TPM_RC_LOCALITY.
NOTE 2 TPM_RC_LOCALITY is returned because the reset attributes are defined on a per-locality basis

如果 PCR 的属性允许重置 PCR 并且提供了适当的授权，则可以使用此命令将所有银行中的 PCR 设置为零。 PCR 的属性可能会限制可以执行重置操作的位置。
注 1：TPM 2.0 第 2 部分中 TPMI_DH_PCR 的定义表明，如果 pcrHandle 超出 PCR 允许的范围，则适当的返回值为 TPM_RC_VALUE。
如果 pcrHandle 引用了一个不能被重置的 PCR，TPM 应该返回 TPM_RC_LOCALITY。
注 2 返回 TPM_RC_LOCALITY 是因为重置属性是在每个区域的基础上定义的


*/
TPM_RC
TPM2_PCR_Reset(
    PCR_Reset_In    *in             // IN: input parameter list
    )
{
// Input Validation

    // Check if the reset operation is allowed by the current command locality
    if(!PCRIsResetAllowed(in->pcrHandle))
        return TPM_RC_LOCALITY;

    // If PCR is state saved and we need to update orderlyState, check NV
    // availability
    if(PCRIsStateSaved(in->pcrHandle))
        RETURN_IF_ORDERLY;

// Internal Data Update

    // Reset selected PCR in all banks to 0
    PCRSetValue(in->pcrHandle, 0);

    // Indicate that the PCR changed so that pcrCounter will be incremented if
    // necessary.
    PCRChanged(in->pcrHandle);

    return TPM_RC_SUCCESS;
}

#endif // CC_PCR_Reset